#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(int *a, int *b){
    int tmp = 0;
    tmp = *b;
    *b = *a;
    *a = tmp;
}

int removeElement(int* nums, int numsSize, int val){

    if(numsSize < 2){
        if(numsSize == 0){
            return 0;
        }
        if(nums[1] == val){
            return 0;
        } else {
            return 1;
        }
    }
    int mCount = 0;
    int iStart = 0, iEnd = numsSize - 1;
    while(1){
        if(nums[iStart] != val){
            ++iStart;
        }
        if( nums[iEnd] == val){
            --iEnd;
        }
        if(nums[iStart] == val && nums[iEnd] != val){
            swap(nums+iStart, nums+iEnd);
            ++mCount;
        }
        if(iStart >= iEnd){
            break;
        }
    }
    return numsSize - mCount;
}

int main(){
    int nums[8] = {0,1,2,2,3,0,4,2};
    int val = 2;
    printf("%d\n",removeElement(nums, 8 , val));
    for(int i = 0 ;i < 8; ++i){
        printf("%d ", nums[i]);
    }
    return 0;
}

/*
    给定一个数组nums和一个val, 移除nums所有值为val的元素
并返回数组新的长度. 无需考虑数组中超出新长度后面的元素


0 1 2 2 3 0 4 2     val = 2
思路 1：启用头尾双指针同时移动, 头指针用于匹配相同的值, 尾指针找到不同的值
用于和头指针替换

.             -
0 1 2 2 3 0 4 2
    .       -
0 1 2 2 3 0 4 2 交换
      .   -
0 1 4 2 3 0 2 2 交换

0 1 4 0 3 2 2 2

*/
